;; ================================
;; 本代码案例由王敏提供并整理
;; ================================
;; 1. 设置智能体和区域属性
extensions [table]  ;; 引入 table 扩展，用于管理键值对数据结构

;; 设置全局属性
globals [
  hot-topics             ;; 热搜话题列表
  file-counter           ;; 文件名后缀
  topic-data-filepath    ;; 存储话题热度数据的文件路径
  user-data-filepath     ;; 存储用户关注数据的文件路径
]

breed [users user]       ;; 定义用户代理
breed [topics topic]     ;; 定义话题代理

;; 设置用户属性
users-own [
  bandwidth           ;; 用户的注意力带宽（每轮最多关注的话题数）
  preference          ;; 用户兴趣偏好：二维向量，表示对娱乐性和社会性的偏好
  pref-category       ;; 用户的兴趣偏好类型（0娱乐 / 1社会 / 2平衡）
  attention-topics-times       ;; 用户对话题的累计关注次数（使用table记录）
  current-attention-topics     ;; 当前时间步用户正在关注的话题列表
  recommend-topics             ;; 当前推荐给用户的话题集合
]

;; 设置话题属性
topics-own [
  topic-attribute  ;; 话题属性：二维向量，表示娱乐性和社会性
  category         ;; 话题类别：0娱乐类 / 1社会类 / 2平衡类
  create-time      ;; 话题创建时间
  if-hot           ;; 是否为热搜话题（1是 / 0否）
  hot-rank         ;; 热搜排名
  hot-duration     ;; 话题在热搜榜单上的持续时间
  attention-level  ;; 当前时间步的关注度
  attention-level-history  ;; 时间窗口内的历史关注度记录
  heat-value       ;; 话题热度值
  current-attention-users     ;; 当前关注该话题的用户列表
]

;; ================================
;; 2. 初始化模型（setup）
to setup
  clear-all                                  ;; 清除所有变量和图形
  reset-ticks                                ;; 重置时间步计数器
  ask patches [ set pcolor green ]           ;; 设置背景颜色为绿色
  setup-users                                ;; 创建用户代理
  generate-new-topic topics-num 0            ;; 初始化生成话题代理，设置初始创建时间为0
  ;; 初始化数据存储相关内容
  generate-datafile                          ;; 创建话题热度数据文件
  save-topic-attention-level topic-data-filepath ticks  ;; 初始记录-1时刻的话题热度
  save-user-attention-level user-data-filepath ticks    ;; 初始记录-1时刻的用户数据
end

;; ================================
;; 2.1 初始化用户代理
to setup-users
  create-users users-num [                   ;; 创建指定数量的用户
    setxy random-xcor random-ycor            ;; 用户在地图中随机分布
    set shape "person"                       ;; 设置用户形状为人形
    set size 2.5                              ;; 设置用户形状大小
    set color yellow                          ;; 用户颜色为黄色
    set bandwidth 15                          ;; 设置注意力带宽为15个话题
    ;; 设置用户兴趣偏好
    ifelse pref-bias? [                       ;; 若开启偏好偏向开关
      let e-prefe random-float 1             ;; 娱乐偏好值随机设定
      let s-prefe 0                           ;; 初始化社会偏好
      ifelse random-float 1 <= users-ent-bias [
        set s-prefe random-float e-prefe     ;; 社会偏好不超过娱乐偏好
      ] [
        set s-prefe random-float (1 - e-prefe) + e-prefe  ;; 社会偏好值根据剩余设定
      ]
      set preference list e-prefe s-prefe    ;; 设置最终偏好
    ] [
      set preference n-values 2 [random-float 1]  ;; 如果不考虑偏好偏向，则随机生成2维偏好向量
    ]
    set pref-category define-attribute-type preference  ;; 根据兴趣偏好向量分类
    set attention-topics-times table:make     ;; 创建关注计数表
    set current-attention-topics []           ;; 初始化当前关注话题为空
    set recommend-topics []                   ;; 初始化推荐话题为空
  ]
end

;; ================================
;; 2.2 初始化话题代理
to generate-new-topic [num create-tick]
  create-topics num [                         ;; 创建num个话题
    setup-topic-basic-attributes              ;; 设置位置和图形属性
    set topic-attribute n-values 2 [random-float 1]   ;; 创建2维话题属性向量
    set category define-attribute-type topic-attribute  ;; 根据属性向量定义类别
    set create-time create-tick               ;; 设置创建时间为当前时间步
    set attention-level random-float 500      ;; 初始关注度为0-500之间的随机值
    set attention-level-history (list attention-level)  ;; 初始化历史记录列表
    set heat-value (int sum attention-level-history)    ;; 初始热度值即当前关注度
    set current-attention-users []            ;; 当前关注用户列表初始化为空
  ]
end

;; 设置话题的基本可视化属性
to setup-topic-basic-attributes
  setxy random-xcor random-ycor              ;; 随机生成话题位置
  set size 1.5                                ;; 设定话题形状大小
  set shape "circle"                         ;; 设置话题形状为圆形
  set color blue                              ;; 普通话题为蓝色
  set if-hot 0                                ;; 是否是热搜话题，初始设为否
  set hot-duration 0                          ;; 初始热搜持续时间为0
end

;; 判断并返回话题/用户的类别
;; 0：偏娱乐，1：偏社会，2：平衡
;; ================================
;; 2.3 定义分类函数
to-report define-attribute-type [attribute]
  if (item 0 attribute > item 1 attribute) [report 0]  ;; 娱乐性强于社会性 → 娱乐类
  if (item 0 attribute < item 1 attribute) [report 1]  ;; 社会性强于娱乐性 → 社会类
  if (item 0 attribute = item 1 attribute) [report 2]  ;; 娱乐性与社会性相等 → 平衡类
end

;; ================================
;; 3. 主运行循环（go）
to go
  ask topics [
    set attention-level 0                    ;; 每轮重置关注度
    set current-attention-users []           ;; 重置当前关注用户列表
  ]
  if ticks > time-to-hot [apply-hotsearch]   ;; 达到热搜触发时间后生成热搜榜单
  ask users [
    choose-attention-topics                  ;; 用户挑选可能关注的话题
    decide-attention-for-topics recommend-topics  ;; 用户对这些话题做出是否关注的决策
    move-users                                  ;; 用户移动
    update-preferences                          ;; 用户根据所关注话题动态调整兴趣偏好
  ]
  ask topics [update-attention-level-history]  ;; 每轮更新话题关注历史并计算热度值
  save-topic-attention-level topic-data-filepath ticks  ;; 保存当前轮话题热度值
  save-user-attention-level user-data-filepath ticks    ;; 保存当前轮用户关注数据
  manage-topics                               ;; 淘汰旧话题并生成新话题，模拟信息流动
  if ticks = stop-ticks [stop]                ;; 达到设定时间步数后停止模拟
  tick                                        ;; 时间推进一轮
end


;; ================================
;;4. 子例程
;; ================================
;; 4.1 热搜筛选机制
to apply-hotsearch
  ask topics [
    set if-hot 0                      ;; 重置为非热搜
    set hot-rank 0                    ;; 排名设为0
    set color blue                    ;; 颜色重置为蓝色
  ]
  let rank-topics reverse (sort-on [heat-value] topics)  ;; 按热度值降序排列话题

  ;; 判断是否开启热搜类别偏向设置
  ifelse hot-bias? [
    ;; 设定偏好占比后筛选娱乐类与社会类热搜话题
    let e-hot-num int hot-topics-num * hot-ent-bias      ;; 娱乐类热搜数
    let s-hot-num hot-topics-num - e-hot-num             ;; 社会类热搜数

    let entertainment-topics filter [i -> [category] of i = 0] rank-topics  ;; 娱乐类话题
    let social-topics filter [i -> [category] of i = 1] rank-topics         ;; 社会类话题

    let selected-entertainment-topics sublist entertainment-topics 0 e-hot-num  ;; 取前e-hot-num个
    let selected-social-topics sublist social-topics 0 s-hot-num                ;; 取前s-hot-num个

    let hot-topics-select sentence selected-entertainment-topics selected-social-topics  ;; 合并两类为热搜
    let hs map [i -> [heat-value] of i] hot-topics-select  ;; 提取热度值（排序用）
    set hot-topics sort-by [[x1 x2] -> ifelse-value ([heat-value] of x1 > [heat-value] of x2) [true] [false]] hot-topics-select  ;; 再按热度排序
  ] [
    ;; 未开启类别偏向时，直接按热度选择前N个话题作为热搜
    set hot-topics sublist rank-topics 0 hot-topics-num
  ]
  ;; 为被选中的热搜话题赋值：标记为热搜，设定排名，改变颜色
  let rank 1
  foreach hot-topics [
    hot-topic -> ask hot-topic [
      set if-hot 1
      set hot-rank rank
      set rank rank + 1
      set color red
    ]
  ]
  ;; 更新热搜时长：若仍在热搜榜则+1，否则归0
  ask topics with [if-hot = 1] [set hot-duration (hot-duration + 1)]
  ask topics with [if-hot = 0] [set hot-duration 0]
end

;; ================================
;; 4.2. 用户关注话题的决策过程
;; 选择用户感兴趣的话题（包括热搜话题和视野范围话题）
to choose-attention-topics
  set recommend-topics []                      ;; 初始化推荐话题列表
  let chosen-hotsearch []                      ;; 用于存储热搜话题
  let chosen-vision []                         ;; 用于存储视野范围话题

  let attention-resource bandwidth             ;; 用户带宽资源，决定关注上限

  ;; 若已达到热搜开放时间，优先考虑热搜话题
  if ticks > time-to-hot [
    ifelse attention-resource > hot-topics-num [
      set chosen-hotsearch sublist hot-topics 0 hot-topics-num       ;; 带宽充足时选择全部热搜话题
      set attention-resource (attention-resource - hot-topics-num)
    ][
      set chosen-hotsearch sublist hot-topics 0 attention-resource   ;; 带宽不足时选前若干热搜
      set attention-resource 0
    ]
  ]

  ;; 若带宽尚有剩余，则在视野中选择个性化推荐话题
  if attention-resource > 0 [
    let vision-topics sort topics in-radius 15 with [if-hot = 0]     ;; 获取视野范围内的非热搜话题
    set chosen-vision personal-recommendation vision-topics attention-resource  ;; 个性化推荐函数
  ]

  set recommend-topics sentence chosen-hotsearch chosen-vision       ;; 合并两类话题为推荐话题列表
end

;; 个性化推荐函数：基于用户兴趣类别推荐视野中话题
to-report personal-recommendation [vision-topics chosen-num]
  let prefe-topics filter [i -> [category] of i = pref-category] vision-topics  ;; 与用户兴趣类别一致的话题
  if length prefe-topics < chosen-num [
    set chosen-num length prefe-topics                                  ;; 若视野内话题不足，调整选取数量
  ]
  let chosen-topics n-of chosen-num prefe-topics                        ;; 从中随机选取话题
  report chosen-topics
end

;; ================================
;; 4.3 用户关注决策函数
;; 用户根据偏好与疲劳程度，决定是否关注推荐话题
to decide-attention-for-topics [chosen-topics]
  let attention-record attention-topics-times    ;; 获取用户关注计数表
  let current-attention []                      ;; 初始化当前关注话题列表

  foreach chosen-topics [
    chosen-topic -> ask chosen-topic [
      let visit-topic-id who
      let visit-times ifelse-value (table:has-key? attention-record visit-topic-id)
        [(table:get attention-record visit-topic-id)]  ;; 获取历史关注次数
        [0]

      let fatigue-degree count-fatigue-degree visit-times  ;; 根据次数计算倦怠值

      let attention-prob (calculate-attention-prob chosen-topic fatigue-degree)  ;; 计算关注概率

      if random-float 1 < attention-prob [
        set attention-level attention-level + 100         ;; 增加话题关注度
        set current-attention lput chosen-topic current-attention  ;; 加入当前关注列表
        table:put attention-record visit-topic-id (visit-times + 1)  ;; 更新关注次数
        set current-attention-users lput myself current-attention-users  ;; 记录关注者
      ]
    ]
  ]

  set attention-topics-times attention-record
  set current-attention-topics current-attention
end

;; ================================
;; 4.4 关注概率计算与倦怠建模
;; 综合兴趣相似度与疲劳程度计算最终关注概率
to-report calculate-attention-prob [chosen-topic fatigue-degree]
  let P_u [preference] of myself                           ;; 获取用户偏好向量
  let pre-degree calculate-cosine-similarity P_u ([topic-attribute] of chosen-topic)  ;; 计算兴趣相似度
  let attention-prob pre-degree * (1 - fatigue-degree)     ;; 综合计算关注概率
  report attention-prob
end

;; 向量余弦相似度函数（用于度量偏好相似性）
to-report calculate-cosine-similarity [vec1 vec2]
  let dot-product sum (map * vec1 vec2)                    ;; 计算点积 A·B
  let magnitude-vec1 sqrt (sum (map [x -> x * x] vec1))    ;; 向量1的模
  let magnitude-vec2 sqrt (sum (map [x -> x * x] vec2))    ;; 向量2的模
  let cosine-similarity dot-product / (magnitude-vec1 * magnitude-vec2)
  report cosine-similarity
end

;; 根据累计关注次数，指数增长模型计算倦怠值
to-report count-fatigue-degree [attention-times]
  let fatigue-degree 0
  let ω 0.1                                 ;; 衰减速度，值越大倦怠增长越快
  set fatigue-degree exp (- ω * attention-times)
  report 1 - fatigue-degree                 ;; 越接近1表示越倦怠
end

;; ================================
;; 4.5. 热度历史更新机制
;; 更新话题的关注历史记录并重新计算热度值（基于时间窗口）
to update-attention-level-history
  let new-attention attention-level                                        ;; 当前时间步的关注度
  set attention-level-history lput new-attention attention-level-history   ;; 添加至历史列表尾部

  if length attention-level-history > time-window [                        ;; 超出窗口长度则移除最早数据
    set attention-level-history but-first attention-level-history
  ]
  set heat-value int sum attention-level-history                           ;; 重新计算热度值（累计）
end

;; ================================
;; 4.6. 话题增减与生命周期机制
;; 淘汰热度最低的10个话题并生成新话题，模拟社交媒体话题更替逻辑（仅基于热度）
to manage-topics
  let sorted-by-heat sort-on [heat-value] topics        ;; 将所有话题按照热度值升序排序
  let die-topics sublist sorted-by-heat 0 10            ;; 选取热度最低的10个话题作为淘汰对象

  foreach die-topics [ x -> ask x [
    let die-id [who] of x
    ask users [                                          ;; 清除所有用户对该话题的关注记录
      if table:has-key? attention-topics-times die-id [
        table:remove attention-topics-times die-id
      ]
    ]
    die                                                  ;; 删除该话题
  ]]

  generate-new-topic 10 (ticks + 1)                ;; 补充新话题，创建时间为下一时间步
end

;; ================================
;; 4.7. 用户行为机制：移动与偏好更新
;; 用户随机移动
to move-users
  rt random 360             ;; 随机改变方向
  fd 1                      ;; 移动指定距离
end

;; 根据用户当前关注的话题属性动态更新用户的兴趣偏好
to update-preferences
  let topic-count length current-attention-topics                   ;; 获取用户当前关注的话题数量
  if topic-count > 0 [
    ;; 获取所有关注话题的属性列表，并按维度分别求和
    let topics-attribute map [i -> [topic-attribute] of i] current-attention-topics
    let sum-entertainment sum map [a -> item 0 a] topics-attribute
    let sum-social sum map [a -> item 1 a] topics-attribute

    ;; 原有兴趣值
    let old-ent item 0 preference
    let old-soc item 1 preference

    ;; 加权平均（+1 代表融合旧偏好）
    set preference list ((sum-entertainment + old-ent) / (topic-count + 1))
                        ((sum-social + old-soc) / (topic-count + 1))

    ;; 更新兴趣类型标签
    set pref-category define-attribute-type preference
  ]
end

;; ================================
;; 4.8. 数据记录与保存模块
;; 创建用于存储话题热度的 CSV 文件
to generate-datafile
  let file-path "./Results/"                                       ;; 设置文件夹路径
  let extension ".csv"                                             ;; 设置文件扩展名
  let basename-1 "topic_heat_values"                               ;; 设置基础文件名
  set topic-data-filepath (word file-path basename-1 "_" (word file-counter-num) extension)  ;; 生成完整文件路径
  file-open topic-data-filepath                                   ;; 打开文件（准备写入）
  file-print (word "TopicID,Category,Importance,Entertainment,CreateTime,HeatValue,IfHot,HotRank,TimeStamp")  ;; 写入表头
  file-close ;; 关闭文件

  let basename-2 "user_attention_values"
  set user-data-filepath (word file-path basename-2 "_" (word file-counter-num) extension)
  file-open user-data-filepath
  file-print (word "UserID,Bandwidth,Preference,PreferenceCategory,TimeStamp")
  file-close

end

;; 每一时间步保存所有话题的热度等状态数据到 CSV
to save-topic-attention-level [filepath time]
  file-open filepath                                               ;; 打开指定文件以写入
  ask topics [
    let entertainment item 0 topic-attribute                       ;; 获取话题娱乐性
    let importance item 1 topic-attribute                          ;; 获取话题社会性（重要性）
    file-print (word who "," category "," importance "," entertainment ","
      create-time "," heat-value "," if-hot "," hot-rank "," (time + 1))  ;; 写入话题数据
  ]
  file-close                                                       ;; 关闭文件
end

;; 每一时间步保存所有用户的偏好与关注状态
to save-user-attention-level [filepath time]
  file-open filepath                                               ;; 打开文件
  ask users [
    file-print (word who "," bandwidth "," preference "," pref-category "," (time + 1))  ;; 写入用户状态数据
  ]
  file-close                                                       ;; 关闭文件
end
@#$#@#$#@
GRAPHICS-WINDOW
322
25
593
297
-1
-1
4.05
1
10
1
1
1
0
1
1
1
-32
32
-32
32
0
0
1
ticks
30.0

SLIDER
24
134
148
167
users-num
users-num
0
500
100.0
1
1
NIL
HORIZONTAL

SLIDER
24
175
149
208
topics-num
topics-num
0
500
250.0
1
1
NIL
HORIZONTAL

BUTTON
23
53
83
87
NIL
setup\n
NIL
1
T
OBSERVER
NIL
NIL
NIL
NIL
1

BUTTON
88
54
149
88
NIL
go
T
1
T
OBSERVER
NIL
NIL
NIL
NIL
1

SLIDER
24
93
148
126
stop-ticks
stop-ticks
0
10000
3000.0
1
1
NIL
HORIZONTAL

SLIDER
24
216
149
249
time-window
time-window
0
100
30.0
1
1
NIL
HORIZONTAL

SLIDER
166
135
306
168
users-ent-bias
users-ent-bias
0
1
0.7
0.1
1
NIL
HORIZONTAL

SLIDER
165
216
307
249
hot-ent-bias
hot-ent-bias
0
1
0.8
0.1
1
NIL
HORIZONTAL

SWITCH
166
95
306
128
pref-bias?
pref-bias?
0
1
-1000

SWITCH
166
176
308
209
hot-bias?
hot-bias?
1
1
-1000

SLIDER
165
257
308
290
file-counter-num
file-counter-num
0
100
2.0
1
1
NIL
HORIZONTAL

SLIDER
23
257
151
290
hot-topics-num
hot-topics-num
0
50
10.0
1
1
NIL
HORIZONTAL

SLIDER
165
54
307
87
time-to-hot
time-to-hot
0
100
20.0
1
1
NIL
HORIZONTAL

@#$#@#$#@
## WHAT IS IT?

(a general understanding of what the model is trying to show or explain)

## HOW IT WORKS

(what rules the agents use to create the overall behavior of the model)

## HOW TO USE IT

(how to use the model, including a description of each of the items in the Interface tab)

## THINGS TO NOTICE

(suggested things for the user to notice while running the model)

## THINGS TO TRY

(suggested things for the user to try to do (move sliders, switches, etc.) with the model)

## EXTENDING THE MODEL

(suggested things to add or change in the Code tab to make the model more complicated, detailed, accurate, etc.)

## NETLOGO FEATURES

(interesting or unusual features of NetLogo that the model uses, particularly in the Code tab; or where workarounds were needed for missing features)

## RELATED MODELS

(models in the NetLogo Models Library and elsewhere which are of related interest)

## CREDITS AND REFERENCES

(a reference to the model's URL on the web if it has one, as well as any other necessary credits, citations, and links)
@#$#@#$#@
default
true
0
Polygon -7500403 true true 150 5 40 250 150 205 260 250

airplane
true
0
Polygon -7500403 true true 150 0 135 15 120 60 120 105 15 165 15 195 120 180 135 240 105 270 120 285 150 270 180 285 210 270 165 240 180 180 285 195 285 165 180 105 180 60 165 15

arrow
true
0
Polygon -7500403 true true 150 0 0 150 105 150 105 293 195 293 195 150 300 150

box
false
0
Polygon -7500403 true true 150 285 285 225 285 75 150 135
Polygon -7500403 true true 150 135 15 75 150 15 285 75
Polygon -7500403 true true 15 75 15 225 150 285 150 135
Line -16777216 false 150 285 150 135
Line -16777216 false 150 135 15 75
Line -16777216 false 150 135 285 75

bug
true
0
Circle -7500403 true true 96 182 108
Circle -7500403 true true 110 127 80
Circle -7500403 true true 110 75 80
Line -7500403 true 150 100 80 30
Line -7500403 true 150 100 220 30

butterfly
true
0
Polygon -7500403 true true 150 165 209 199 225 225 225 255 195 270 165 255 150 240
Polygon -7500403 true true 150 165 89 198 75 225 75 255 105 270 135 255 150 240
Polygon -7500403 true true 139 148 100 105 55 90 25 90 10 105 10 135 25 180 40 195 85 194 139 163
Polygon -7500403 true true 162 150 200 105 245 90 275 90 290 105 290 135 275 180 260 195 215 195 162 165
Polygon -16777216 true false 150 255 135 225 120 150 135 120 150 105 165 120 180 150 165 225
Circle -16777216 true false 135 90 30
Line -16777216 false 150 105 195 60
Line -16777216 false 150 105 105 60

car
false
0
Polygon -7500403 true true 300 180 279 164 261 144 240 135 226 132 213 106 203 84 185 63 159 50 135 50 75 60 0 150 0 165 0 225 300 225 300 180
Circle -16777216 true false 180 180 90
Circle -16777216 true false 30 180 90
Polygon -16777216 true false 162 80 132 78 134 135 209 135 194 105 189 96 180 89
Circle -7500403 true true 47 195 58
Circle -7500403 true true 195 195 58

circle
false
0
Circle -7500403 true true 0 0 300

circle 2
false
0
Circle -7500403 true true 0 0 300
Circle -16777216 true false 30 30 240

cow
false
0
Polygon -7500403 true true 200 193 197 249 179 249 177 196 166 187 140 189 93 191 78 179 72 211 49 209 48 181 37 149 25 120 25 89 45 72 103 84 179 75 198 76 252 64 272 81 293 103 285 121 255 121 242 118 224 167
Polygon -7500403 true true 73 210 86 251 62 249 48 208
Polygon -7500403 true true 25 114 16 195 9 204 23 213 25 200 39 123

cylinder
false
0
Circle -7500403 true true 0 0 300

dot
false
0
Circle -7500403 true true 90 90 120

face happy
false
0
Circle -7500403 true true 8 8 285
Circle -16777216 true false 60 75 60
Circle -16777216 true false 180 75 60
Polygon -16777216 true false 150 255 90 239 62 213 47 191 67 179 90 203 109 218 150 225 192 218 210 203 227 181 251 194 236 217 212 240

face neutral
false
0
Circle -7500403 true true 8 7 285
Circle -16777216 true false 60 75 60
Circle -16777216 true false 180 75 60
Rectangle -16777216 true false 60 195 240 225

face sad
false
0
Circle -7500403 true true 8 8 285
Circle -16777216 true false 60 75 60
Circle -16777216 true false 180 75 60
Polygon -16777216 true false 150 168 90 184 62 210 47 232 67 244 90 220 109 205 150 198 192 205 210 220 227 242 251 229 236 206 212 183

fish
false
0
Polygon -1 true false 44 131 21 87 15 86 0 120 15 150 0 180 13 214 20 212 45 166
Polygon -1 true false 135 195 119 235 95 218 76 210 46 204 60 165
Polygon -1 true false 75 45 83 77 71 103 86 114 166 78 135 60
Polygon -7500403 true true 30 136 151 77 226 81 280 119 292 146 292 160 287 170 270 195 195 210 151 212 30 166
Circle -16777216 true false 215 106 30

flag
false
0
Rectangle -7500403 true true 60 15 75 300
Polygon -7500403 true true 90 150 270 90 90 30
Line -7500403 true 75 135 90 135
Line -7500403 true 75 45 90 45

flower
false
0
Polygon -10899396 true false 135 120 165 165 180 210 180 240 150 300 165 300 195 240 195 195 165 135
Circle -7500403 true true 85 132 38
Circle -7500403 true true 130 147 38
Circle -7500403 true true 192 85 38
Circle -7500403 true true 85 40 38
Circle -7500403 true true 177 40 38
Circle -7500403 true true 177 132 38
Circle -7500403 true true 70 85 38
Circle -7500403 true true 130 25 38
Circle -7500403 true true 96 51 108
Circle -16777216 true false 113 68 74
Polygon -10899396 true false 189 233 219 188 249 173 279 188 234 218
Polygon -10899396 true false 180 255 150 210 105 210 75 240 135 240

house
false
0
Rectangle -7500403 true true 45 120 255 285
Rectangle -16777216 true false 120 210 180 285
Polygon -7500403 true true 15 120 150 15 285 120
Line -16777216 false 30 120 270 120

leaf
false
0
Polygon -7500403 true true 150 210 135 195 120 210 60 210 30 195 60 180 60 165 15 135 30 120 15 105 40 104 45 90 60 90 90 105 105 120 120 120 105 60 120 60 135 30 150 15 165 30 180 60 195 60 180 120 195 120 210 105 240 90 255 90 263 104 285 105 270 120 285 135 240 165 240 180 270 195 240 210 180 210 165 195
Polygon -7500403 true true 135 195 135 240 120 255 105 255 105 285 135 285 165 240 165 195

line
true
0
Line -7500403 true 150 0 150 300

line half
true
0
Line -7500403 true 150 0 150 150

pentagon
false
0
Polygon -7500403 true true 150 15 15 120 60 285 240 285 285 120

person
false
0
Circle -7500403 true true 110 5 80
Polygon -7500403 true true 105 90 120 195 90 285 105 300 135 300 150 225 165 300 195 300 210 285 180 195 195 90
Rectangle -7500403 true true 127 79 172 94
Polygon -7500403 true true 195 90 240 150 225 180 165 105
Polygon -7500403 true true 105 90 60 150 75 180 135 105

plant
false
0
Rectangle -7500403 true true 135 90 165 300
Polygon -7500403 true true 135 255 90 210 45 195 75 255 135 285
Polygon -7500403 true true 165 255 210 210 255 195 225 255 165 285
Polygon -7500403 true true 135 180 90 135 45 120 75 180 135 210
Polygon -7500403 true true 165 180 165 210 225 180 255 120 210 135
Polygon -7500403 true true 135 105 90 60 45 45 75 105 135 135
Polygon -7500403 true true 165 105 165 135 225 105 255 45 210 60
Polygon -7500403 true true 135 90 120 45 150 15 180 45 165 90

sheep
false
15
Circle -1 true true 203 65 88
Circle -1 true true 70 65 162
Circle -1 true true 150 105 120
Polygon -7500403 true false 218 120 240 165 255 165 278 120
Circle -7500403 true false 214 72 67
Rectangle -1 true true 164 223 179 298
Polygon -1 true true 45 285 30 285 30 240 15 195 45 210
Circle -1 true true 3 83 150
Rectangle -1 true true 65 221 80 296
Polygon -1 true true 195 285 210 285 210 240 240 210 195 210
Polygon -7500403 true false 276 85 285 105 302 99 294 83
Polygon -7500403 true false 219 85 210 105 193 99 201 83

square
false
0
Rectangle -7500403 true true 30 30 270 270

square 2
false
0
Rectangle -7500403 true true 30 30 270 270
Rectangle -16777216 true false 60 60 240 240

star
false
0
Polygon -7500403 true true 151 1 185 108 298 108 207 175 242 282 151 216 59 282 94 175 3 108 116 108

target
false
0
Circle -7500403 true true 0 0 300
Circle -16777216 true false 30 30 240
Circle -7500403 true true 60 60 180
Circle -16777216 true false 90 90 120
Circle -7500403 true true 120 120 60

tree
false
0
Circle -7500403 true true 118 3 94
Rectangle -6459832 true false 120 195 180 300
Circle -7500403 true true 65 21 108
Circle -7500403 true true 116 41 127
Circle -7500403 true true 45 90 120
Circle -7500403 true true 104 74 152

triangle
false
0
Polygon -7500403 true true 150 30 15 255 285 255

triangle 2
false
0
Polygon -7500403 true true 150 30 15 255 285 255
Polygon -16777216 true false 151 99 225 223 75 224

truck
false
0
Rectangle -7500403 true true 4 45 195 187
Polygon -7500403 true true 296 193 296 150 259 134 244 104 208 104 207 194
Rectangle -1 true false 195 60 195 105
Polygon -16777216 true false 238 112 252 141 219 141 218 112
Circle -16777216 true false 234 174 42
Rectangle -7500403 true true 181 185 214 194
Circle -16777216 true false 144 174 42
Circle -16777216 true false 24 174 42
Circle -7500403 false true 24 174 42
Circle -7500403 false true 144 174 42
Circle -7500403 false true 234 174 42

turtle
true
0
Polygon -10899396 true false 215 204 240 233 246 254 228 266 215 252 193 210
Polygon -10899396 true false 195 90 225 75 245 75 260 89 269 108 261 124 240 105 225 105 210 105
Polygon -10899396 true false 105 90 75 75 55 75 40 89 31 108 39 124 60 105 75 105 90 105
Polygon -10899396 true false 132 85 134 64 107 51 108 17 150 2 192 18 192 52 169 65 172 87
Polygon -10899396 true false 85 204 60 233 54 254 72 266 85 252 107 210
Polygon -7500403 true true 119 75 179 75 209 101 224 135 220 225 175 261 128 261 81 224 74 135 88 99

wheel
false
0
Circle -7500403 true true 3 3 294
Circle -16777216 true false 30 30 240
Line -7500403 true 150 285 150 15
Line -7500403 true 15 150 285 150
Circle -7500403 true true 120 120 60
Line -7500403 true 216 40 79 269
Line -7500403 true 40 84 269 221
Line -7500403 true 40 216 269 79
Line -7500403 true 84 40 221 269

wolf
false
0
Polygon -16777216 true false 253 133 245 131 245 133
Polygon -7500403 true true 2 194 13 197 30 191 38 193 38 205 20 226 20 257 27 265 38 266 40 260 31 253 31 230 60 206 68 198 75 209 66 228 65 243 82 261 84 268 100 267 103 261 77 239 79 231 100 207 98 196 119 201 143 202 160 195 166 210 172 213 173 238 167 251 160 248 154 265 169 264 178 247 186 240 198 260 200 271 217 271 219 262 207 258 195 230 192 198 210 184 227 164 242 144 259 145 284 151 277 141 293 140 299 134 297 127 273 119 270 105
Polygon -7500403 true true -1 195 14 180 36 166 40 153 53 140 82 131 134 133 159 126 188 115 227 108 236 102 238 98 268 86 269 92 281 87 269 103 269 113

x
false
0
Polygon -7500403 true true 270 75 225 30 30 225 75 270
Polygon -7500403 true true 30 75 75 30 270 225 225 270
@#$#@#$#@
NetLogo 6.4.0
@#$#@#$#@
@#$#@#$#@
@#$#@#$#@
@#$#@#$#@
@#$#@#$#@
default
0.0
-0.2 0 0.0 1.0
0.0 1 1.0 0.0
0.2 0 0.0 1.0
link direction
true
0
Line -7500403 true 150 150 90 180
Line -7500403 true 150 150 210 180
@#$#@#$#@
0
@#$#@#$#@
